package com.linchong.xshop.web.superadmin.shopadmin;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.linchong.xshop.dto.ImageHolder;
import com.linchong.xshop.dto.ProductExecution;
import com.linchong.xshop.entity.Product;
import com.linchong.xshop.entity.ProductCategory;
import com.linchong.xshop.entity.Shop;
import com.linchong.xshop.enums.ProductStateEnum;
import com.linchong.xshop.exceptions.ProductOperationException;
import com.linchong.xshop.service.ProductCategoryService;
import com.linchong.xshop.service.ProductService;
import com.linchong.xshop.util.CodeUtil;
import com.linchong.xshop.util.HttpServletRequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @BelongsProject:xshop
 * @BelongsPackage:com.linchong.xshop.web.superadmin.shopadmin
 * @Author:linchong
 * @CreateTime:2018-08-09 18:55
 * @Description:商品管理路由
 */

@Controller
@RequestMapping("/shopadmin")
public class ProductManagementController {

    @Autowired
    private ProductService productService;

    @Autowired
    private ProductCategoryService productCategoryService;


    @RequestMapping(value="/getproductlistbyshop",method = RequestMethod.GET)
    @ResponseBody
    private Map<String,Object> getProductListByShop(HttpServletRequest request){

        Map<String,Object> modelMap = new HashMap<>();
        //获取从前台传递来的页码
        int pageIndex = HttpServletRequestUtil.getInt(request,"pageIndex");
        //获取从前台传递来的每页要求返回的商品数量上限
        int pageSize = HttpServletRequestUtil.getInt(request,"pageSize");
        //从当前的session中获取店铺信息，主要是获取shopId
        Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");
        //空值判断
        if((pageIndex > -1) && (pageSize > -1) &&(currentShop != null) &&(currentShop.getShopId() != null)){
            //获取到传入的需要检索的条件，包括是否需要从某个商品类别以及模糊查询中查找商品名去筛选某个店铺下的商品列表
            //筛选的条件可以进行排列组合
            long productCategoryId = HttpServletRequestUtil.getLong(request,"productCategoryId");
            String productName = HttpServletRequestUtil.getString(request,"productName");
            Product productCondition = compactProductCondition(currentShop.getShopId(),
                    productCategoryId,productName);

            //传入查询条件以及分页信息进行查询，返回相对应的商品列表以及总数
            ProductExecution pe = productService.getProductList(productCondition,pageIndex,pageSize);
            modelMap.put("productList",pe.getProductList());
            modelMap.put("count",pe.getCount());
            modelMap.put("success",true);

        }else{
            modelMap.put("success",false);
            modelMap.put("errMsg","empty pageSize or pageIndex or shopId");
        }
        return modelMap;
    }

    private Product compactProductCondition(long shopId,
                                                   long productCategoryId, String productName) {
        Product productCondition = new Product();
        Shop shop = new Shop();
        shop.setShopId(shopId);
        productCondition.setShop(shop);
        //若有指定类别的要求则添加进去
        if (productCategoryId != -1L) {
            ProductCategory productCategory = new ProductCategory();
            productCategory.setProductCategoryId(productCategoryId);
            productCondition.setProductCategory(productCategory);
        }
        //若有商品名，模糊查询的要求则添加进去
        if (productName != null) {
            productCondition.setProductName(productName);
        }
        return productCondition;
    }


    //支持最大的上传商品详情图的最大数量
    private static final int IMAGEMAXCOUNT = 6;

    @RequestMapping(value = "/modifyproduct",method = RequestMethod.POST)
    @ResponseBody
    private Map<String,Object> modifyProduct(HttpServletRequest request){

        Map<String,Object> modelMap = new HashMap<>();
        //是商品编辑的时候调用还是商品下架的时候调用
        //前者进行验证码判断，后者则跳过验证码判断
        boolean statusChange = HttpServletRequestUtil.getBoolean(request,"statusChange");
        //验证码判断
        if(!statusChange && !CodeUtil.checkVerifyCode(request)){
            modelMap.put("success",false);
            modelMap.put("errMsg","输入了错误的验证码！");
            return modelMap;
        }

        //接受前端参数的变量的初始化，包括商品、缩略图、详情图列表实体类
        ObjectMapper mapper = new ObjectMapper();
        Product product = null;
        ImageHolder thumbnail = null;
        List<ImageHolder> productImgList = new ArrayList<>();
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext()
        );

        //若请求中存在文件流，则取出相关的文件(包括缩略图和详情图)
        try{
            if(multipartResolver.isMultipart(request)){
                thumbnail = handleImage((MultipartHttpServletRequest) request, thumbnail, productImgList);

            }
        }catch (Exception e){
             modelMap.put("success",false);
             modelMap.put("errMsg",e.toString());
             return modelMap;
        }

        try{
            String productStr = HttpServletRequestUtil.getString(request,"productStr");
            //尝试获取前端传递来的表单string列并将其转换为Prodcut实体类
            product = mapper.readValue(productStr,Product.class);
        }catch (Exception e){
            modelMap.put("success",false);
            modelMap.put("errMsg",e.toString());
            return modelMap;
        }

        //非空判断
        if(product != null){
            try{
                //从session中获取当前店铺的id并赋值给product,减少对前端数据的依赖
                Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");
//                Shop shop = new Shop();
//                shop.setShopId(currentShop.getShopId());
                //product.setShop(shop);
                product.setShop(currentShop);
                //开始进行商品信息变更操作
                ProductExecution pe = productService.modifyProduct(product,thumbnail,productImgList);
                if(pe.getState() == ProductStateEnum.SUCCESS.getState()){
                    modelMap.put("success",true);
                }else {
                    modelMap.put("success",false);
                    modelMap.put("errMsg",pe.getStateInfo());
                }
            }catch (RuntimeException e){
                modelMap.put("success",false);
                modelMap.put("errMsg",e.toString());
                return modelMap;
            }
        }else {
            modelMap.put("success",false);
            modelMap.put("errMsg","请输入商品信息");
        }
        return modelMap;
    }
    /**
     * 根据id获取商品信息
     * @param productId
     * @return
     */
    @RequestMapping(value = "getproductbyid",method = RequestMethod.GET)
    @ResponseBody
    private Map<String,Object> getProductById(@RequestParam Long productId){

        Map<String,Object> modelMap = new HashMap<>();
        //非空判断
        if(productId > -1){
            //获取商品信息
            Product product = productService.getProductById(productId);
            //获取该店铺下商品类别列表
            List<ProductCategory> productCategoryList = productCategoryService
                    .getProductCategoryList(product.getShop().getShopId());
            modelMap.put("product",product);
            modelMap.put("productCategoryList",productCategoryList);
            modelMap.put("success",true);
        }else {
            modelMap.put("success",false);
            modelMap.put("errMsg","empty productId");
        }

        return modelMap;

    }

    /**
     * 添加商品信息
     * @param request
     * @return
     */
    @RequestMapping(value = "/addproduct" ,method = RequestMethod.POST)
    @ResponseBody
    private Map<String,Object> addProduct(HttpServletRequest request){

        Map<String,Object> modelMap = new HashMap<>();
        //验证码校验
        if(!CodeUtil.checkVerifyCode(request)){
            modelMap.put("success",false);
            modelMap.put("errMsg","输入了错误的验证码！");
            return modelMap;
        }

        //接受前端的参数的变量的初始化，包括商品、缩略图、详情列表实体类
        ObjectMapper mapper = new ObjectMapper();
        Product product = null;
        String productStr = HttpServletRequestUtil.getString(request,"productStr");
        //MultipartHttpServletRequest multipartRequest = null; //处理文件流
        ImageHolder thumbnail = null; //处理缩略图
        List<ImageHolder> productImgList = new ArrayList<>(); //商品详情图
        CommonsMultipartResolver multipartResolver =
                new CommonsMultipartResolver(request.getSession().getServletContext());

        try{
            //若果请求中存在文件流，则取出相关的文件(包括缩略图和详情图)
            if(multipartResolver.isMultipart(request)){
                thumbnail = handleImage((MultipartHttpServletRequest) request, thumbnail, productImgList);
            }else {
                modelMap.put("success",false);
                modelMap.put("errMsg","上传图片不能为空");
                return modelMap;
            }
        }catch (Exception e){

            modelMap.put("success",false);
            modelMap.put("errMsg",e.toString());
            return modelMap;
        }

        try{
            //尝试获取前端传递来的表单String流并将其转换为Product实体类
            product = mapper.readValue(productStr,Product.class);
        }catch (Exception e){
            modelMap.put("success",false);
            modelMap.put("errMsg",e.toString());
            return modelMap;
        }

        //如果product信息、缩略图、详情列表为非空，则开始进行商品的添加操作
        if(product != null && thumbnail != null && productImgList.size() >0){

            try{
                //从session中获取当前店铺的Id并赋值给product,减少前端对数据的依赖
                Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");
//                Shop shop = new Shop();
//                shop.setShopId(currentShop.getShopId());
               // product.setShop(shop);currentShop
                product.setShop(currentShop);
                //执行添加操作
                ProductExecution pe = productService.addProduct(product,thumbnail,productImgList);
                if(pe.getState()== ProductStateEnum.SUCCESS.getState()){
                    modelMap.put("success",true);
                }else {
                    modelMap.put("success",false);
                    modelMap.put("errMsg",pe.getStateInfo());
                }
            }catch (ProductOperationException e){
                modelMap.put("success",false);
                modelMap.put("errMsg",e.toString());
                return modelMap;
            }
        }else {
            modelMap.put("success",false);
            modelMap.put("errMsg","请输入商品信息");
        }

        return modelMap;
    }

    private ImageHolder handleImage(MultipartHttpServletRequest request, ImageHolder thumbnail, List<ImageHolder> productImgList) throws IOException {
        MultipartHttpServletRequest multipartRequest = request;
        //取出缩略图并构建ImageHolder对象
        CommonsMultipartFile thumbnailFile = (CommonsMultipartFile) multipartRequest.getFile("thumbnail");
        if (thumbnailFile != null) {
            thumbnail = new ImageHolder(thumbnailFile.getOriginalFilename(), thumbnailFile.getInputStream());
        }
        //取出详情图列表并构建List<ImageHolder>列表对象，最多支持六张图片上传
        for (int i = 0; i < IMAGEMAXCOUNT; i++) {
            CommonsMultipartFile productImgFile = (CommonsMultipartFile) multipartRequest.getFile("productImg" + i);
            //取出的第i个详情图片文件流不为空，将其加入到详情图列表
            if (productImgFile != null) {
                ImageHolder productImg = new ImageHolder(productImgFile.getOriginalFilename(),
                        productImgFile.getInputStream());

                productImgList.add(productImg);
            } else {
                //若取出的第i个图片为空，终止循环
                break;
            }
        }
        return thumbnail;
    }
}
